# 类也是对象
# 类的类型是 type，这就是元类,元类是用来创建类的类. metaclass 相当于类的模板
# type 函数既可以返回一个对象的类型，也可以创建新的类型，也就是我们无需通过 class 关键字就可以定义类

# metaclass --> class --> object

# 属性是与对象相关联的数据
# 方法是一种特殊的函数, 方法的第一个参数总是self，它代表类的实例本身
# 函数是独立的代码块，而方法是类的一部分

# 使用class 创建类

# class Student():
#     def __init__(self, name):
#         self.name = name
#     def print_hello(self):
#         print(f"{self.name} , hello")

# james = Student("James")
# james.print_hello()

# 使用 type() 函数就可以创建 Student 类
# 若类中包含方法，那么我们可以先定义该函数
def print_hello(self):
    print(f"Hello, {self.name}!")

Student = type('Student', (object,), dict(name='James', act=print_hello))
        #    Student是类的名称;  object指定基类; 字典，定义了类属性和方法

James = Student()
James.act()

# 不提前定义方法,使用lambda函数也可以

# Stu = type('Stu', (object,), dict(name='James2',
#            act2=lambda self: print(f"HELLO, {self.name}")))  # 创建类
# James2 = Stu()  # 创建类的实例
# James2.act2()

# print(James2.act2())  # 调用类方法;  print(f"HELLO, {self.name}")----当没有在此处书写print,那么外面才需要print一下 ,即: print(James2.act2()) 
# print(Stu.act2(James2)) #等于上一条语句

